package ${basePackage}.generator;

import freemarker.template.TemplateException;
import java.io.File;
import ${basePackage}.model.DataModel;
import java.io.IOException;

<#--宏定义，将重复代码抽出成变量
    generateFile：变量名
    fileInfo：参数（表示文件信息）
    indent：参数（表示缩进）-->
<#macro generateFile fileInfo indent>

${indent}inputPath = new File(inputRootPath, "${fileInfo.inputPath}").getAbsolutePath();
${indent}outputPath = new File(outputRootPath, "${fileInfo.outputPath}").getAbsolutePath();
<#if fileInfo.generateType == "static">
${indent}// 静态文件生成
${indent}StaticGenerator.copyFilesByHutool(inputPath, outputPath);
<#else>
${indent}// 动态文件生成
${indent}DynamicGenerator.doGenerate(inputPath, outputPath, model);
</#if>
</#macro>

/**
 * 核心生成器
 */
public class MainGenerator {
    /**
     * 生成
     *
     * @param model 数据模型
     * @throws TemplateException
     * @throws IOException
     */
    public static void doGenerate(DataModel model) throws TemplateException, IOException {
        String inputRootPath = "${fileConfig.inputRootPath}";
        String outputRootPath = "${fileConfig.outputRootPath}";

        String inputPath;
        String outputPath;

    <#--生成model对象的基础属性-->
    <#list modelConfig.models as modelInfo>
        <#if modelInfo.groupKey??>
        <#list modelInfo.models as subModelInfo>
        ${subModelInfo.type} ${subModelInfo.fieldName} = model.${modelInfo.groupKey}.${subModelInfo.fieldName};
        </#list>
        <#else>
        ${modelInfo.type} ${modelInfo.fieldName} = model.${modelInfo.fieldName};
        </#if>
    </#list>

    <#--循环生成 生成动静态文件的代码-->
    <#list fileConfig.files as fileInfo>
        <#--判断文件类型是否为文件组，如果是文件组类型，则groupKey值会不为空-->
        <#if fileInfo.groupKey??>
        <#--为文件组类型时-->
        // groupKey = ${fileInfo.groupKey}
        <#--通过文件组中的condition参数控制整个文件组中的文件是否生成-->
        <#if fileInfo.condition??>
        <#--文件组中的condition不为空，则控制文件组中的文件生成-->
        if(${fileInfo.condition}) {
        <#list fileInfo.files as fileInfo>
            <@generateFile fileInfo=fileInfo indent="            "/>
        </#list>
        }
        <#--文件组中的condition为空，则不控制文件组中的文件生成-->
        <#else>
        <#list fileInfo.files as fileInfo>
            <@generateFile fileInfo=fileInfo indent="        "/>
        </#list>
        </#if>
        <#--不为文件组类型-->
        <#else>
        <#--判断该文件中的condition参数是否为空-->
        <#if fileInfo.condition??>
        <#--文件中的condition参数不为空，则通过condition参数控制该文件的生成-->
        if(${fileInfo.condition}) {
            <@generateFile fileInfo=fileInfo indent="            "/>
        }
        <#--文件中的condition参数为空，则不控制该文件的生成-->
        <#else>
            <@generateFile fileInfo=fileInfo indent="        "/>
        </#if>
        </#if>
    </#list>
    }
}
